package com.szgz.platform.model;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 任务步骤实体类
 * 对应task_steps表
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("task_steps")
public class TaskStep {

    /**
     * 步骤ID，主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 关联的任务ID，外键关联tasks表
     */
    @TableField("task_id")
    private Long taskId;

    /**
     * 父步骤ID，用于支持步骤的层级结构，NULL表示顶级步骤
     */
    @TableField("parent_step_id")
    private Long parentStepId;

    /**
     * 步骤顺序，同级步骤内的排序，从1开始
     */
    @TableField("step_order")
    private Integer stepOrder;

    /**
     * 步骤类型：instruction(说明), coding(编程), quiz(测验), upload(上传), review(审核)
     */
    @TableField("step_type")
    private String stepType;

    /**
     * 步骤标题
     */
    @TableField("title")
    private String title;

    /**
     * 步骤详细描述
     */
    @TableField("description")
    private String description;

    /**
     * 步骤内容，可以是富文本、代码模板、题目等
     */
    @TableField("content")
    private String content;

    /**
     * 步骤要求，完成该步骤需要满足的条件
     */
    @TableField("requirements")
    private String requirements;

    /**
     * 预计完成时间（分钟）
     */
    @TableField("estimated_time")
    private Integer estimatedTime;

    /**
     * 最大分值，用于评分
     */
    @TableField("max_score")
    private BigDecimal maxScore;

    /**
     * 及格分值
     */
    @TableField("pass_score")
    private BigDecimal passScore;

    /**
     * 是否必做：1-必做，0-选做
     */
    @TableField("is_required")
    private Boolean isRequired;

    /**
     * 是否可见：1-可见，0-隐藏
     */
    @TableField("is_visible")
    private Boolean isVisible;

    /**
     * 是否可跳过：1-可跳过，0-不可跳过
     */
    @TableField("can_skip")
    private Boolean canSkip;

    /**
     * 依赖关系，JSON格式存储依赖的步骤ID列表
     */
    @TableField("dependencies")
    private String dependencies;

    /**
     * 相关资源，JSON格式存储文件、链接等
     */
    @TableField("resources")
    private String resources;

    /**
     * 扩展元数据，JSON格式存储自定义字段
     */
    @TableField("metadata")
    private String metadata;

    /**
     * 步骤状态：active(激活), inactive(停用), deleted(删除)
     */
    @TableField("status")
    private String status;

    /**
     * 创建时间
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;

    /**
     * 创建者ID
     */
    @TableField("created_by")
    private Long createdBy;

    /**
     * 更新者ID
     */
    @TableField("updated_by")
    private Long updatedBy;

    // 非数据库字段，用于业务逻辑

    /**
     * 子步骤列表
     */
    @TableField(exist = false)
    private List<TaskStep> children;

    /**
     * 父步骤信息
     */
    @TableField(exist = false)
    private TaskStep parent;

    /**
     * 当前用户的完成状态
     */
    @TableField(exist = false)
    private TaskStepCompletion userCompletion;

    /**
     * 依赖的步骤列表
     */
    @TableField(exist = false)
    private List<TaskStep> dependencySteps;

    /**
     * 步骤类型枚举
     */
    public enum StepType {
        INSTRUCTION("instruction", "说明"),
        CODING("coding", "编程"),
        QUIZ("quiz", "测验"),
        UPLOAD("upload", "上传"),
        REVIEW("review", "审核");

        private final String code;
        private final String label;

        StepType(String code, String label) {
            this.code = code;
            this.label = label;
        }

        public String getCode() {
            return code;
        }

        public String getLabel() {
            return label;
        }

        public static StepType fromCode(String code) {
            for (StepType type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return INSTRUCTION;
        }
    }

    /**
     * 步骤状态枚举
     */
    public enum StepStatus {
        ACTIVE("active", "激活"),
        INACTIVE("inactive", "停用"),
        DELETED("deleted", "删除");

        private final String code;
        private final String label;

        StepStatus(String code, String label) {
            this.code = code;
            this.label = label;
        }

        public String getCode() {
            return code;
        }

        public String getLabel() {
            return label;
        }

        public static StepStatus fromCode(String code) {
            for (StepStatus status : values()) {
                if (status.code.equals(code)) {
                    return status;
                }
            }
            return ACTIVE;
        }
    }
} 